#include <iostream>
#include <unistd.h>
#include <vector>
#include <functional>
#include <signal.h>
#include <stdlib.h>
#include <string>
#include<sys/wait.h>

void printfpending(const sigset_t &pending)
{
    std::cout << "当前进程，pending的列表 [" << getpid() <<"]";
    for(int sig = 31;sig>0;sig--)
    {
        if(sigismember(&pending,sig))//判断信号是否在集合里
        {
            std::cout << 1;//存在打印1
        }
        else
        {
            std::cout << 0;//不存在打印0
        }
    }
    std::cout << std::endl;
}

void hand(int sig)
{

}

int main()
{
    ::signal(2,SIG_IGN);//第1种方式
    //::signal(2,hand);//第2种方式


    // 1. 对2号信号进行屏蔽
    // block,oblock是在用户栈上开辟的空间
    sigset_t block,oblock;//可能是乱码，我们需要清0
    sigemptyset(&block);//指定的信号，进行屏蔽
    sigemptyset(&oblock);//清0

    //1.1添加2号信号
    // 问题：我们有没有把对2号信号的屏蔽，设置进入内核中？只是在用户栈上设置了block的位图结构
    // 并没有设置进入内核中！
    sigaddset(&block,2);//把2号信号添加到，block集合里

    //1.2设置进内核中
    sigprocmask(SIG_SETMASK,&block,&oblock);//设置进block，老的oblock带出来
    int cnt = 0;
    while(true)
    {
        // 2. 如何获取pending表呢？
        sigset_t pending;
        sigpending(&pending);

        //2.1打印
        printfpending(pending);
        sleep(1);
        cnt++;
        if(cnt == 10)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
        }
    }
    return 0; 
}  
